# Dockfile 最佳实践
# 编写.dockerignore文件
# 一个容器只运行单个应用
# 基础镜像和生产镜像的标签不要使用latest
# 设置WORKDIR和CMD
# 使用ENTRYPOINT，并用exec启动命令（可选）
# 相比ADD，优先使用COPY
# 设置默认的环境变量，映射端口和数据卷
# 使用LABEL设置镜像元数据
# 添加HEALTHCHECK

# 多阶段构造 从编译打包到镜像构建
# 如果本地可构建，则无需使用maven编译打包阶段
# FROM maven:3.5.0-jdk-8-alpine AS builder

# 创建临时文件
# RUN mkdir /build

#将 src目录复制到临时目录
# ADD src /build/src

# 将 pom文件复制到临时目录
# ADD pom.xml /build

# 打包
# RUN cd /build && mvn clean package

# 最好是只打基础镜像，在运行时指定运行镜像为jdk， 这样基础镜像不用包含jre运行时,就会变的很小，而运行镜像使用只有1个
# Second stage: minimal runtime environment
FROM openjdk:8-jre-alpine

MAINTAINER spring-docker

# copy jar from the first stage # --from=builder
COPY  ./target/springboot-docker-0.0.1.jar app.jar

EXPOSE 8000

ENV profile=dev
ENV Xms=256
ENV Xmx=256

# CMD ["java", "-jar", "app.jar"]


ENV JAVA_OPTS=""
ENV opens='--add-opens java.base/java.lang=ALL-UNNAMED \
--add-opens java.base/java.util=ALL-UNNAMED \
--add-opens java.base/java.time=ALL-UNNAMED \
--add-opens java.base/java.util.concurrent=ALL-UNNAMED \
--add-opens java.base/java.math=ALL-UNNAMED \
--add-opens java.base/java.nio=ALL-UNNAMED \
--add-opens java.base/java.net=ALL-UNNAMED \
--add-opens java.base/java.text=ALL-UNNAMED \
--add-opens java.base/sun.nio.ch=ALL-UNNAMED \
--add-opens java.sql/java.sql=ALL-UNNAMED'

# -XX:NativeMemoryTracking=detail
# -XX:MaxDirectMemorySize=20M
# -XX:MetaspaceSize=48M
# -XX:MaxMetaspaceSize=48M
# -XX:+HeapDumpOnOutOfMemoryError
# -XX:HeapDumpPath=./logs

# 永远使用EXEC语法
# ENTRYPOINT java -jar -Xms${Xms}m -Xmx${Xmx}m /app.jar # --spring.profiles.active=${ACTIVE_ENV}\
ENTRYPOINT ["sh", "-c", "java  -Xms${Xms}m -Xmx${Xmx}m ${JAVA_OPTS}  $opens -jar /app.jar"]

